package cn.fz;

import com.example.*;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Import;

/**
 * 我们使用@Import注解通过这三种方式都可以导入第三方依赖中所提供的bean或者是配置类。
 *
 * 思考：如果基于以上方式完成自动配置，当要引入一个第三方依赖时，是不是还要知道第三方依赖中有哪些配置类和哪些Bean对象？
 *
 * 答案：是的。 （对程序员来讲，很不友好，而且比较繁琐）
 * 思考：当我们要使用第三方依赖，依赖中到底有哪些bean和配置类，谁最清楚？
 *
 * 答案：第三方依赖自身最清楚。
 * 结论：我们不用自己指定要导入哪些bean对象和配置类了，让第三方依赖它自己来指定。
 *
 * 怎么让第三方依赖自己指定bean对象和配置类？
 *
 * 比较常见的方案就是第三方依赖给我们提供一个注解，这个注解一般都以@EnableXxxx开头的注解，注解中封装的就是@Import注解
 * 4). 使用第三方依赖提供的 @EnableXxxxx注解
 */
@EnableHeaderConfig  //使用第三方依赖提供的Enable开头的注解
// @Import({MyImportSelector.class})        // 导入ImportSelector接口实现类
// @Import({HeaderParser.class, HeaderGenerator.class, TokenParser.class}) //导入普通类 @Import 导入（使用@Import导入的类会被Spring加载到IOC容器中）
@ServletComponentScan  // 开启对Servlet组件的支持
@SpringBootApplication //等价下面三个注解之和
/**
 * @SpringBootConfiguration:
 *      等价于@Configuration--用来声明配置类
 * @EnableAutoConfiguration: 开启自动配置
 *      @Import({AutoConfigurationImportSelector.class})
 * @ComponentScan：扫描组件的注解，默认扫描启动类所在包及其子包
 */
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}